home *** CD-ROM | disk | FTP | other *** search
/ Aminet 35 / Aminet 35 (2000)(Schatztruhe)[!][Feb 2000].iso / Aminet / dev / e / cha_source.lha / cha_source / complex.e < prev    next >
Encoding:
Text File  |  1999-12-18  |  3.2 KB  |  121 lines

  1. /*==========================================================================+
  2. | complex.e                                                                 |
  3. | complex number functions                                                  |
  4. | NB: all functions allow input(s) and output to be the same object         |
  5. +--------------------------------------------------------------------------*/
  6.  
  7. OPT PREPROCESS
  8. OPT MODULE
  9.  
  10. #define PI 3.14159265
  11. #define FLOAT LONG
  12.  
  13. /*-------------------------------------------------------------------------*/
  14.  
  15. EXPORT OBJECT complex
  16. PUBLIC
  17.     re : FLOAT
  18.     im : FLOAT
  19. ENDOBJECT
  20.  
  21. EXPORT PROC ccopy(a : PTR TO complex, to : PTR TO complex)
  22.     to.re := a.re
  23.     to.im := a.im
  24. ENDPROC to
  25.  
  26. EXPORT PROC cadd(a : PTR TO complex, b : PTR TO complex, to : PTR TO complex)
  27.     to.re := ! a.re + b.re
  28.     to.im := ! a.im + b.im
  29. ENDPROC to
  30.  
  31. EXPORT PROC csub(a : PTR TO complex, b : PTR TO complex, to : PTR TO complex)
  32.     to.re := ! a.re - b.re
  33.     to.im := ! a.im - b.im
  34. ENDPROC to
  35.  
  36. EXPORT PROC cneg(a : PTR TO complex, to : PTR TO complex)
  37.     to.re := ! -a.re
  38.     to.im := ! -a.im
  39. ENDPROC to
  40.  
  41. EXPORT PROC cmul(a : PTR TO complex, b : PTR TO complex, to : PTR TO complex)
  42.     DEF t : FLOAT
  43.     t     := ! (! a.re * b.re) - (! a.im * b.im)
  44.     to.im := ! (! a.re * b.im) + (! a.im * b.re)
  45.     to.re := t
  46. ENDPROC to
  47.  
  48. EXPORT PROC cdiv(a : PTR TO complex, b : PTR TO complex, to : PTR TO complex)
  49.     DEF t : complex
  50.     cconj(b, t)
  51.     cmul(a, t, t)
  52.     csmul(! 1.0 / cabs2(b), t, to)
  53. ENDPROC to
  54.  
  55. EXPORT PROC csmul(a : FLOAT, b : PTR TO complex, to : PTR TO complex)
  56.     to.re := ! a * b.re
  57.     to.im := ! a * b.im
  58. ENDPROC to
  59.  
  60. EXPORT PROC csdiv(a : FLOAT, b : PTR TO complex, to : PTR TO complex)
  61.     DEF r2 : FLOAT
  62.     r2 := cabs2(b)
  63.     to.re := !  a * b.re / r2
  64.     to.im := ! -a * b.im / r2
  65. ENDPROC to
  66.  
  67. EXPORT PROC cconj(a : PTR TO complex, to : PTR TO complex)
  68.     to.re := !  a.re
  69.     to.im := ! -a.im
  70. ENDPROC to
  71.  
  72. EXPORT PROC cexp(a : PTR TO complex, to : PTR TO complex)
  73.     DEF r : FLOAT
  74.     r := Fexp(a.re)
  75.     to.re := ! r * Fcos(a.im)
  76.     to.im := ! r * Fsin(a.im)
  77. ENDPROC to
  78.  
  79. EXPORT PROC cexpj(a : FLOAT, to : PTR TO complex)
  80.     to.re := Fcos(a)
  81.     to.im := Fsin(a)
  82. ENDPROC to
  83.  
  84. EXPORT PROC cabs2(a : PTR TO complex) IS ! (! a.re * a.re) + (! a.im * a.im)
  85. EXPORT PROC cabs(a : PTR TO complex) IS Fsqrt(cabs2(a))
  86. EXPORT PROC carg(a : PTR TO complex) IS fatan2(a.im, a.re)
  87.  
  88. EXPORT PROC ceq(a : PTR TO complex, b : PTR TO complex) IS (! a.re = b.re) AND (! a.im = b.im)
  89.  
  90. EXPORT PROC csqrt(a : PTR TO complex, to : PTR TO complex)
  91.     DEF r : FLOAT, neg, t
  92.     neg := (! a.im < 0)
  93.     r := cabs(a)
  94.     t     := Fsqrt(! 0.5 * (! r + a.re))
  95.     to.im := Fsqrt(! 0.5 * (! r - a.re))
  96.     to.re := t
  97.     IF neg THEN to.im := ! -to.im
  98. ENDPROC to
  99.  
  100. /*-------------------------------------------------------------------------*/
  101.  
  102. EXPORT PROC fatan2(y : FLOAT, x : FLOAT)
  103.     IF y = 0
  104.         RETURN 0
  105.     ELSEIF x = 0
  106.         RETURN IF y > 0 THEN !PI/2.0 ELSE !-PI/2.0
  107.     ELSEIF x > 0
  108.         RETURN Fatan(!y/x)
  109.     ELSEIF y > 0
  110.         RETURN ! Fatan(!-x/y) + (! PI / 2.0)
  111.     ELSE
  112.         RETURN ! Fatan(!-x/y) - (! PI / 2.0)
  113.     ENDIF
  114. ENDPROC
  115.  
  116. EXPORT PROC fasinh(x : FLOAT) IS Flog(! x + Fsqrt(! 1.0 + (! x * x)))
  117.  
  118. /*--------------------------------------------------------------------------+
  119. | END: complex.e                                                            |
  120. +==========================================================================*/
  121.